2025年12月7日
ハードウェア
LLM向けファインチューニング解説: ChatML形式とAlpaca形式を比較
LLMファインチューニングには主にAlpaca形式とChatML形式の2つのデータフォーマットが存在します。それぞれの歴史的背景、データ構造の違い、性能特性を解説し、Unslothでの実装方法を紹介。どちらの形式を選ぶべきかの判断基準も示します。

要約
- Instruction Tuningは2021年のGoogle FLANから始まり、InstructGPTを経てChatGPTへと進化した「指示に従うAI」を作るための基盤技術
- LLMファインチューニングのデータ形式は主に「Alpaca形式(シングルターン)」と「ChatML形式(マルチターン)」の2種類が存在
- Llama 3、Qwen2、Gemmaなどの最新モデルはChat形式を採用しており、Unslothは両形式に完全対応している
ファインチューニングとは
ファインチューニング(Fine-tuning)とは、事前学習済みの大規模言語モデル(LLM)に対して、特定のタスクやドメインに特化したデータセットで追加学習を行う手法です。ゼロからモデルを訓練するプレトレーニングと比較して、少ないデータ・計算リソースで目的に合ったモデルを構築できるという大きなメリットがあります。
ファインチューニングの成否を決める重要な要素の一つが「データフォーマット」です。同じデータ内容でも、どのような形式でモデルに入力するかによって、学習効率や最終的な性能が大きく変わります。本稿では、LLMファインチューニングにおける2つの主要なデータ形式について、その歴史的背景から実装方法まで詳しく解説いたします。
Instruction Tuningとは
概念の誕生
Instruction Tuning(指示チューニング)とは、事前学習済みの言語モデルに対して「指示→応答」形式のデータで追加学習を行い、ユーザーの指示に従って適切な応答を生成できるようにする手法です。
この概念は2021年にGoogleが発表した「FLAN(Finetuned Language Net)」で初めて体系化されました。FLANは、62種類の自然言語処理タスクを「指示形式」に変換したデータセットで言語モデルを学習させることで、未知のタスクへの汎化能力が大幅に向上することを実証しました。
InstructGPTの影響
2022年、OpenAIが発表した「InstructGPT」は、Instruction Tuningの実用化において決定的な役割を果たしました。InstructGPTは、人間のフィードバックを用いた強化学習(RLHF: Reinforcement Learning from Human Feedback)と組み合わせることで、より人間の意図に沿った応答を生成できるようになりました。
このInstructGPTの成功が、後のChatGPTやGPT-4の基盤技術となり、現在の対話型AIの隆盛につながっています。
Instruction Tuningの3つの世代
Instruction Tuningは、大きく3つの世代に分けられます。第1世代はFLANに代表される「タスク指示型」で、特定のNLPタスクを指示形式で学習させるものでした。第2世代はInstructGPTやAlpacaに代表される「汎用指示型」で、より多様な指示に対応できるようになりました。そして第3世代が、ChatGPTのような「対話型」で、マルチターンの会話を通じて指示を理解し実行できるようになっています。
Alpaca形式の歴史と特徴
歴史的背景
2023年3月、Stanford大学の研究チームが「Alpaca」を公開しました。これは、Meta社のLLaMA 7Bモデルを、OpenAIのtext-davinci-003から生成した52,000件の指示応答データでファインチューニングしたものです。当時としては革新的な成果で、わずか100ドル以下のコストでChatGPTに匹敵する性能を実現できることを示しました。
このAlpacaプロジェクトで採用されたデータ形式が「Alpaca形式」または「Instruction形式」と呼ばれ、以降のオープンソースLLM開発における標準フォーマットの一つとなりました。
データ構造
Alpaca形式は、3つのフィールドで構成されます:
{ "instruction": "次の文章を英語に翻訳してください", "input": "今日は良い天気です", "output": "It is a nice day today." }
inputフィールドはオプションで、単純なタスクでは省略されることもあります:
{ "instruction": "日本の首都はどこですか?", "input": "", "output": "日本の首都は東京です。" }
プロンプトテンプレート
実際の学習時には、これらのフィールドを以下のようなテンプレートに変換します:
### Instruction: 次の文章を英語に翻訳してください ### Input: 今日は良い天気です ### Response: It is a nice day today.
メリットと限界
Alpaca形式の最大のメリットは、そのシンプルさにあります。既存のQ&Aデータセットや、タスク別のデータを簡単にこのフォーマットに変換できます。
一方で、大きな限界も存在します。それは「シングルターン」にしか対応していないことです。ChatGPTのような対話システムでは、ユーザーとAIが複数回やり取りを行いますが、Alpaca形式ではこのマルチターン会話を自然に表現することができません。
ChatML形式の登場と進化
ChatMLとは
ChatML(Chat Markup Language)は、OpenAIがGPT-3.5/4で採用した会話フォーマットです。複数のメッセージを「役割(role)」と「内容(content)」のペアとして構造化することで、マルチターン会話を自然に表現できます。
データ構造
ChatML形式では、会話を「messages」配列として表現します:
{ "messages": [ {"role": "system", "content": "あなたは親切なアシスタントです。"}, {"role": "user", "content": "こんにちは"}, {"role": "assistant", "content": "こんにちは!何かお手伝いできることはありますか?"}, {"role": "user", "content": "今日の天気を教えて"}, {"role": "assistant", "content": "申し訳ありませんが、リアルタイムの天気情報にはアクセスできません。お住まいの地域の天気予報サイトをご確認ください。"} ] }
実際のトークン化
ChatML形式では、特殊トークンを使用して各メッセージの境界を明確にします:
<|im_start|>system あなたは親切なアシスタントです。<|im_end|> <|im_start|>user こんにちは<|im_end|> <|im_start|>assistant こんにちは!何かお手伝いできることはありますか?<|im_end|>
この特殊トークン(<|im_start|>, <|im_end|>)により、モデルは発話者の切り替わりを正確に認識し、適切なタイミングで応答を生成できるようになります。
ShareGPT形式との関係
ChatML形式と似た構造を持つものとして「ShareGPT形式」があります。これは、ChatGPTとの会話ログを共有するサービス「ShareGPT」から派生したフォーマットで、from/valueというキー名を使用します:
{ "conversations": [ {"from": "human", "value": "こんにちは"}, {"from": "gpt", "value": "こんにちは!"} ] }
Unslothではstandardize_sharegpt関数を使用して、このShareGPT形式をChatML形式に変換することができます。
2つの形式の比較
| 比較項目 | Alpaca形式 | ChatML形式 |
|---|---|---|
| 登場時期 | 2023年3月 | 2023年(OpenAI API) |
| 会話ターン | シングルターンのみ | マルチターン対応 |
| システムプロンプト | テンプレートに固定 | 柔軟に設定可能 |
| データ変換の容易さ | 簡単 | やや複雑 |
| 推奨ユースケース | 分類・抽出・翻訳など | チャットボット・対話AI |
| 最新モデルの対応 | 限定的 | ほぼ全モデル対応 |
Unslothでの実装
Unslothは、メモリ効率の良いファインチューニングを実現するライブラリで、両方の形式に対応しています。
対応しているチャットテンプレート一覧
Unslothは以下のチャットテンプレートをサポートしています:
from unsloth.chat _templates import CHAT_TEMPLATES print(list(CHAT_TEMPLATES.keys())) # 出力例: # ['unsloth', 'zephyr', 'chatml', 'mistral', 'llama', 'vicuna', # 'alpaca', 'gemma', 'gemma2', 'llama-3', 'llama-3.1', 'llama-3.2', # 'llama-3.3', 'qwen-2.5', 'phi-4', 'gemma-3']
ChatML形式での実装例
from unsloth import FastLanguageModel from unsloth.chat _templates import get_chat_template # モデルとトークナイザーの読み込み model, tokenizer = FastLanguageModel.from_pretrained( model_name="unsloth/Llama-3.2-3B-Instruct", max_seq_length=2048, load_in_4bit=True, ) # ChatMLテンプレートを適用 tokenizer = get_chat_template( tokenizer, chat_template="chatml", ) # データセットのフォーマット関数 def formatting_prompts_func(examples): convos = examples["conversations"] texts = [ tokenizer.apply_chat_template( convo, tokenize=False, add_generation_prompt=False ) for convo in convos ] return {"text": texts}
Alpaca形式での実装例
from unsloth import FastLanguageModel model, tokenizer = FastLanguageModel.from_pretrained( model_name="unsloth/Llama-3.2-3B", max_seq_length=2048, load_in_4bit=True, ) # Alpaca形式のプロンプトテンプレート alpaca_prompt = """### Instruction: {instruction} ### Input: {input} ### Response: {output}""" def formatting_func(examples): texts = [] for instruction, input_text, output in zip( examples["instruction"], examples["input"], examples["output"] ): text = alpaca_prompt.format( instruction=instruction, input=input_text, output=output ) texts.append(text) return {"text": texts}
シングルターンからマルチターンへの変換
Unslothのconversation_extensionパラメータを使用すると、シングルターンのAlpacaデータセットを擬似的にマルチターン会話に拡張することができます。これにより、シンプルなデータセットでもより自然な対話能力を学習させることが可能になります。
どちらを選ぶべきか?
ChatML形式を推奨するケース
対話型のチャットボットやアシスタントを構築する場合は、ChatML形式を強く推奨します。Llama 3、Qwen2、Gemma 3などの最新モデルは、事前学習の段階でChat形式のデータを使用しており、同じフォーマットでファインチューニングすることで最も効率的に性能を引き出せます。
また、システムプロンプトによる動作制御が必要な場合や、会話履歴を考慮した応答生成が求められる場合もChatML形式が適しています。
Alpaca形式で十分なケース
一方で、テキスト分類、情報抽出、翻訳、要約など、明確な入出力関係があるタスクでは、Alpaca形式でも十分な性能を発揮できます。データ準備が簡単で、既存のデータセットを流用しやすいというメリットもあります。
日本語ローカルLLMへの応用
日本語でのローカルLLM開発においても、これらのデータ形式の選択は重要な意味を持ちます。日本語の対話データは英語と比較して限られているため、少ないデータで効果的に学習できる形式の選択が成功の鍵となります。特に、業務特化型のチャットボット開発では、社内ナレッジや専門用語を含むデータをChatML形式で整備し、ファインチューニングすることで、セキュアかつ高精度な対話システムを構築できます。Unslothのようなメモリ効率の良いライブラリを活用することで、コンシューマグレードのGPU(RTX 3090/4090など)でも実用的なファインチューニングが可能になっています。